import os
import numpy as np


class DataFile:
  DATA_SUFFIX = ('.dat' , '.data')
  @staticmethod
  def is_data_file(filename):
    file_suffix = os.path.splitext(filename)[1].lower()
    print(file_suffix)

    return file_suffix in DataFile.DATA_SUFFIX

  @staticmethod
  def read_dat(filename, default=None) -> dict:
    '''
      .dat 文件没有一种统一的读取方法，因为 .dat 是一个通用的文件扩展名，它可以被用来表示几乎任何形式的数据。
      这种文件可能包含文本、二进制数据或特定于特定应用程序的格式化数据。
      因此，要正确读取 .dat 文件，您通常需要知道文件的结构和预期的格式。
      所以这里我留出了read_dat方法，允许根据实际情况你重写这个方法，以保证软件可以正确读取你的文件。
    '''
    result = {}
    result["img"] = None
    result["info"] = None
    ####################################
    # read img info
    with open(filename, 'rb') as f:
        img = np.frombuffer(f.read(), np.uint8)
        print(img)
        if len(img) < 512 * 512:
            img = np.concatenate([img, np.zeros(512 * 512 - len(img))])
            print(len(img))
        img = img.reshape(512, 512)
        result["img"] = img

    #####################################
    # read head info
    head = []
    info = []
    with open(filename, "r") as f:
      try:
          for i , line in enumerate(f.readlines()) :
            if i == 0 : # 表头
              for key in line.split(' ') :
                if key != '' :
                  if key[-1] == '\n' : key = key[:-1]
                  head.append(key)
              continue
            if line[-1] == '\n' :
              line = line[:-1]  # 删除每一个行的换行符
            info.append(line)
          ret = {}
          # ['Dy', 'MxT', 'MnT', 'AvT', 'HDDay', 'AvDP', '1HrP', 'TPcpn', 'WxType', 'PDir', 'AvSp', 'Dir', 'MxS', 'SkyC', 'MxR',
          #  'MnR', 'AvSLP']
          for line in info :
            line = line.split(' ')
            cnt = 0
            for v in line :
              if v == '' : continue
              else:
                if cnt == 4 :
                  if float(v)  < 20 :
                    kv = ret.setdefault(head[cnt], None)
                    if kv == None:
                      ret[head[cnt]] = [v]  # HDDay
                    else:
                      ret[head[cnt]].append(v)
                    cnt += 1
                    continue
                  else :
                    kv = ret.setdefault(head[cnt], None)
                    if kv == None:
                      ret[head[cnt]] = ['-1']  # HDDay
                    else:
                      ret[head[cnt]].append('-1')
                    cnt += 1
                    continue
                    # ret.get(head[cnt], []).append(v)  # AvDP
                if cnt == 6 :
                  kv = ret.setdefault(head[cnt], None)
                  if kv == None:
                    ret[head[cnt]] = ['-1']  # HDDay
                  else:
                    ret[head[cnt]].append('-1')
                  # ret[head[cnt]] = ret.get(head[cnt], []).append(-1)  # 1HrP
                  cnt += 1
                  continue

                if cnt == 8 :
                  if not v.isdigit() :
                    ret.get(head[cnt], []).append(v)  # 1HrP
                  else :
                    cnt += 1
                    continue
                kv = ret.setdefault(head[cnt] , None)
                if kv == None :
                  ret[head[cnt]] = [v]  # HDDay
                else:
                  ret[head[cnt]].append(v)
                cnt += 1
                if len(head) == cnt : cnt = 0
          result['info'] = ret
      except UnicodeDecodeError:
          result['info'] = None
    return result

